home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / share / checkbox / install / config next >
Text File  |  2009-11-05  |  5KB  |  163 lines

  1. #!/usr/bin/python
  2. #
  3. # This program is meant to be called by the debian installer in order to
  4. # create configuration files for the checkbox package and derived packages
  5. # based on the preseed values.
  6.  
  7. import os
  8. import re
  9. import sys
  10. import posixpath
  11.  
  12. from ConfigParser import ConfigParser
  13. from optparse import OptionParser
  14.  
  15. from debconf import Debconf, DebconfCommunicator
  16.  
  17.  
  18. DEFAULT_SECTION = "DEFAULT"
  19.  
  20.  
  21. class Config(ConfigParser):
  22.  
  23.     def write(self, fp):
  24.         """Write an .ini-format representation of the configuration state."""
  25.         if self._defaults:
  26.             fp.write("[%s]\n" % DEFAULT_SECTION)
  27.             defaults = dict(self._defaults)
  28.  
  29.             # Write includes first
  30.             if 'includes' in defaults:
  31.                 key = 'includes'
  32.                 value = defaults.pop(key)
  33.                 value = str(value).replace('\n', '\n\t')
  34.                 fp.write("%s = %s\n" % (key, value))
  35.  
  36.             for (key, value) in defaults.items():
  37.                 value = str(value).replace('\n', '\n\t')
  38.                 fp.write("%s = %s\n" % (key, value))
  39.  
  40.             fp.write("\n")
  41.  
  42.         # Sort sections and options to prevent diffs
  43.         sections = sorted(self._sections)
  44.         for section in sections:
  45.             fp.write("[%s]\n" % section)
  46.             options = self._sections[section]
  47.             options = [(k, options[k]) for k in sorted(options.keys())]
  48.             for (key, value) in options:
  49.                 if key != "__name__":
  50.                     fp.write("%s = %s\n" %
  51.                              (key, str(value).replace('\n', '\n\t')))
  52.  
  53.             fp.write("\n")
  54.  
  55.  
  56. class Install(object):
  57.     """Install module for generating checkbox configuration files.
  58.  
  59.     The checkbox module and derivatives use a configuration file format
  60.     compatible with ConfigParser. The values for the keys defined in
  61.     this file can be preseeded during the installation of the package by
  62.     using this module during the config phase of the package installation
  63.     process.
  64.     """
  65.     question_separator = "/"
  66.     template_separator = ": "
  67.  
  68.     configs_base = "/usr/share/%(base_name)s/configs/%(name)s.ini"
  69.     examples_base = "/usr/share/%(base_name)s/examples/%(name)s.ini"
  70.     templates_base = "/var/lib/dpkg/info/%(name)s.templates"
  71.  
  72.     def __init__(self, name, configs_path=None, examples_path=None,
  73.                  templates_path=None):
  74.         self.name = name
  75.         self.base_name = re.sub(r"(-cli|-gtk)$", "", name)
  76.         self._configs_path = configs_path or self.configs_base \
  77.             % {"name": name, "base_name": self.base_name}
  78.         self._examples_path = examples_path or self.examples_base \
  79.             % {"name": name, "base_name": self.base_name}
  80.         self._templates_path = templates_path or self.templates_base \
  81.             % {"name": name, "base_name": self.base_name}
  82.  
  83.         self._config = Config()
  84.         if os.environ.get("DEBIAN_HAS_FRONTEND"):
  85.             if os.environ.get("DEBCONF_REDIR"):
  86.                 write = os.fdopen(3, "w")
  87.             else:
  88.                 write = sys.stdout
  89.             self._debconf = Debconf(write=write)
  90.         else:
  91.             self._debconf = DebconfCommunicator(self.name)
  92.  
  93.     def write(self, file):
  94.         """
  95.         Write phase of the config process which takes a file object
  96.         as argument.
  97.         """
  98.         for path in [self._examples_path, self._configs_path]:
  99.             if path and posixpath.isfile(path):
  100.                 self._config.read(path)
  101.  
  102.         # Hack to retrieve questions from templates file
  103.         if posixpath.exists(self._templates_path):
  104.             templates_file = open(self._templates_path)
  105.             buffer = templates_file.read()
  106.             for block in re.split(r"\n{2,}", buffer):
  107.                 if not block:
  108.                     continue
  109.  
  110.                 element = {}
  111.                 for line in block.split("\n"):
  112.                     if not line or line.startswith(" "):
  113.                         continue
  114.  
  115.                     (key, value) = line.split(self.template_separator, 1)
  116.                     key = key.lower()
  117.                     element[key] = value
  118.  
  119.                 question = element["template"]
  120.                 old_value = element.get("default", "")
  121.                 new_value = self._debconf.get(question)
  122.                 # Only set different values
  123.                 if old_value != new_value:
  124.                     section, name = question.rsplit(self.question_separator, 1)
  125.                     if not self._config.has_section(section):
  126.                         self._config.add_section(section)
  127.                     self._config.set(section, name, new_value)
  128.  
  129.         # Write config file
  130.         self._config.write(file)
  131.  
  132.  
  133. def main(args):
  134.     """
  135.     Main routine for running this script. The arguments are:
  136.  
  137.     package_name    Name of the package to configure.
  138.     optional        Optional arguments specific to the given command.
  139.     """
  140.     parser = OptionParser()
  141.     parser.add_option("-o", "--output",
  142.       default="-",
  143.       help="Output file, - for stdout.")
  144.     (options, args) = parser.parse_args(args)
  145.  
  146.     if len(args) < 1:
  147.         return 1
  148.  
  149.     package = args.pop(0)
  150.     install = Install(package)
  151.  
  152.     if options.output == "-":
  153.          file = sys.stdout
  154.     else:
  155.          file = open(options.output, "w")
  156.     install.write(file)
  157.  
  158.     return 0
  159.  
  160.  
  161. if __name__ == "__main__":
  162.     sys.exit(main(sys.argv[1:]))
  163.